#include <config.h>
#include "uart.h"
#include "GPIO.h"
#include "delay.h"
#include "softServo.h"

#define CTRL_MESH_NET_ID            "2568"
#define CTRL_MESH_SELF_ADDR         "0001"
#define CTRL_MESH_SELF_NAME         "Center"
#define CTRL_MESH_SELF_NAME_SIZE    6

#define KORO_CARD_ID_LIGHT          1 // ����
#define KORO_CARD_ID_DARK           2 // ����

typedef unsigned char uint8_t;

void GPIO_config();
void UART_config();
void my_uart_transmit(uint8_t *buf, uint8_t strSize);
uint8_t my_uart_recive_block(uint8_t *buf, uint8_t blockMs);
uint8_t analyze_mesh(uint8_t *buf, uint8_t bufSize);

uint8_t recvSize = 0;
uint8_t recvBuf[50];

void main(void){
	uint8_t i = 90;
	GPIO_config();
	P54 = 1;
	UART_config();
    ServoA_Turn(90);
	EA = 1;
	
    while(i --){
	    delay_ms(10);
    }
	my_uart_transmit("AT\r\n", 4);
    i = my_uart_recive_block(recvBuf, 50);
	if(i == 0 || !((recvBuf[0] == '+') && (recvBuf[1] == 'O') && (recvBuf[2] == 'K'))){ // JDY-25M �豸������
        if(recvBuf[0] != 'O' || recvBuf[1] != 'K'){
			while(1){
					ServoA_Turn(100);
					delay_ms(500);
					ServoA_Turn(90);
					delay_ms(500);
			}
		}
    }

	my_uart_transmit("AT+ROLE5\r\n", 10);
	delay_ms(100);
	my_uart_transmit("AT+NETID"CTRL_MESH_NET_ID"\r\n", 14);
	delay_ms(100);
	my_uart_transmit("AT+MADDR"CTRL_MESH_SELF_ADDR"\r\n", 14);
	delay_ms(100);
//	my_uart_transmit("AT+MCLSS"CTRL_MESH_SELF_TYPE"\r\n", 11);
//	delay_ms(100);
	my_uart_transmit("AT+NAME"CTRL_MESH_SELF_NAME"\r\n", 9+CTRL_MESH_SELF_NAME_SIZE);
	delay_ms(100);

	my_uart_transmit("AT+RESET\r\n", 10);
	
	delay_ms(20);
    COM1.RX_TimeOut = 0;
    COM1.RX_Cnt = 0;
	
	while(1){
		delay_ms(1);
		if(COM1.RX_TimeOut > 0){	//��ʱ����
			if(--COM1.RX_TimeOut == 0){
				if(COM1.RX_Cnt > 0){
					for(i = 0; i < COM1.RX_Cnt; i++){
                        recvBuf[i] = RX1_Buffer[i];
                    }
                    recvSize = COM1.RX_Cnt;
				}
				COM1.RX_Cnt = 0;
			}
		}
        
        if(recvSize){
            analyze_mesh(recvBuf, recvSize);
            recvSize = 0;
        }
	}
	
}

void GPIO_config(){
	GPIO_InitTypeDef GPIO_InitStructure;		//�ṹ����
 
	GPIO_InitStructure.Pin  = GPIO_Pin_4 | GPIO_Pin_5;		//ָ��Ҫ��ʼ����IO, GPIO_Pin_0 ~ GPIO_Pin_7
	GPIO_InitStructure.Mode = GPIO_OUT_PP;	//ָ��IO������������ʽ,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
	GPIO_Inilize(GPIO_P5,&GPIO_InitStructure);	//��ʼ��
	
	GPIO_InitStructure.Pin  = GPIO_Pin_2 | GPIO_Pin_3;		//ָ��Ҫ��ʼ����IO, GPIO_Pin_0 ~ GPIO_Pin_7
	GPIO_InitStructure.Mode = GPIO_PullUp;	//ָ��IO������������ʽ,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
	GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);	//��ʼ��
}

void UART_config(){
	COMx_InitDefine		COMx_InitStructure;					//�ṹ����
	COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;	    //ģʽ, 
//    UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
	COMx_InitStructure.UART_BRT_Use   = BRT_Timer1;			//ʹ�ò�����,BRT_Timer1,BRT_Timer2 (ע��: ����2�̶�ʹ��BRT_Timer2)
	COMx_InitStructure.UART_BaudRate  = 9600ul;				//������, һ�� 110 ~ 115200
	COMx_InitStructure.UART_RxEnable  = ENABLE;				//��������,   ENABLE��DISABLE
	COMx_InitStructure.BaudRateDouble = DISABLE;			//�����ʼӱ�, ENABLE��DISABLE
	COMx_InitStructure.UART_Interrupt = ENABLE;				//�ж�����,   ENABLE��DISABLE
	COMx_InitStructure.UART_Priority    = Priority_0;			//ָ���ж����ȼ�(�͵���)             
//    Polity_0,Polity_1,Polity_2,Polity_3
	COMx_InitStructure.UART_P_SW      = UART1_SW_P36_P37;	//�л��˿�,   
//    UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
	UART_Configuration(UART1, &COMx_InitStructure);		//��ʼ������1 
//    UART1,UART2,UART3,UART4
 
//	PrintString1("STC8H8K64U UART1 Test Programme!\r\n");	//UART1����һ���ַ���
}

void my_uart_transmit(uint8_t *buf, uint8_t bufSize){
	uint8_t i;
	for(i = 0; i < bufSize; i ++){
		TX1_write2buff(buf[i]);
	}
}

uint8_t my_uart_recive_block(uint8_t *buf, uint8_t blockMs){
	uint8_t i;
    uint8_t bufSize = 0;

    while(blockMs --){
		delay_ms(1);
		if(COM1.RX_TimeOut > 0){	//��ʱ����
			if(--COM1.RX_TimeOut == 0){
				if(COM1.RX_Cnt > 0){
					for(i = 0; i < COM1.RX_Cnt; i++){
                        buf[i] = RX1_Buffer[i];
                    }
                    bufSize = COM1.RX_Cnt;
				}
				COM1.RX_Cnt = 0;
				// ���ף����ܼ� break
				// break;
			}
		}
	}

    return bufSize;
}


/*
0: 0x25
1: ������ ID
2: �Զ������
3: 0x68
*/
uint8_t analyze_mesh(uint8_t *buf, uint8_t bufSize){
    if((buf[7] == 0x25) && (buf[10] == 0x68)){
		buf[7] = 0;
		buf[10] = 0;
        switch(buf[8]){ // ���ݿ����� ID ����ִ����Щ����
            case KORO_CARD_ID_LIGHT: // ���ƣ�����
                ServoA_Turn(100);
                delay_ms(100);
                ServoA_Turn(90);

                break;

            case KORO_CARD_ID_DARK: // ���ƣ��ص�
                ServoA_Turn(80);
                delay_ms(100);
                ServoA_Turn(90);

                break;

            default: // δ֪ ID
                break;
        }
        switch(buf[9]){ // �����Զ����������ִ����Щ����
            

            default:
                break;
        }
    }else { // �ǿ�������
		ServoA_Turn(80);
		delay_ms(100);
		ServoA_Turn(90);
		delay_ms(100);
		ServoA_Turn(100);
		delay_ms(100);
		ServoA_Turn(90);
    }
	
	return 0;
}

